class Hook {
  constructor(args){
    if(!Array.isArray(args)){
      args = [] 
      this.args = args; // 把参数的数组存放在钩子内部
      this.taps = [] // 存放事件函数配置对象的数组
      this.call = CALL_DELEGATE; // 初始化call方法
    }
  }
  tap(option, fn){
    this._taps('sync', option, fn)
  }
  _taps(type, options, fn){
    if(typeof options === 'string'){
      options = {
        name: options,
      }
    }
    // 如果是对象，合并
    let tapInfo = {...options, type, fn}
    this._insert(tapInfo)
  }

  _insert(tapInfo){
    this.taps.push(tapInfo)

  }
  compile(options){
    throw new Error('抽象方法，需要被子类重写')
  }

  _createCall(type){
    return this.compile({
      taps: this.taps,
      args: this.args,
      type
    })

  }
}

const CALL_DELEGATE = function(...args){
  this.call  = this._createCall('sync') //调用它的时候，会动态创建, 让子类自己去实现这个方法，
  return this.call(...args) // 执行新创建的call方法
}

module.exports = Hook